package com.vepick.metier.requetes;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

import com.vepick.vue.interfaceClient.InterfaceClient;

/*
 * Classe qui g�re la partie location d'un client abonn�
 */
public class Requetes_stationAbo extends Requetes_station {
	/*
	 * M�thode qui r�cup�re les infos n�cessaires pour enregistrer la location (idVelo, idBornette, idClassif) dans un tableau tres moche
	 * Fait ensuite appel � une m�thode pour enregistrer cette location dans la bdd
	 */
	public static void effectuerLocationAbo(Connection conn, int idStation,
			int idClient) throws SQLException {
		System.out.println("On recupere les informations necessaires");
		//le tableau tres moche,...
		int lesVelo[][] = new int[1][3];
		String typeClassif = "std";
		String requete = "SELECT v.idVelo, b.idBornette, c.typeClassif FROM Bornette b JOIN VELO v on b.idVelo=v.idVelo"
				+ " JOIN STATION s on b.idStation=s.idStation"
				+ " LEFT OUTER JOIN (SELECT * FROM CLASSIFICATION WHERE sysdate between heureDebutClassif AND heureFinClassif) c ON s.idStation=c.idStation"
				+ " WHERE s.idStation ="
				+ idStation
				+ " AND v.etatVelo=1 AND v.localisationVelo='Bornette'";
		Statement stmt = conn.createStatement();
		//on r�cup�re les infos, et on ne les stocke que pour le 1er r�sultat
		ResultSet res = stmt.executeQuery(requete);
		while (res.next()) {
			if (res.isFirst()) {
				lesVelo[0][0] = res.getInt("idVelo");
				lesVelo[0][1] = res.getInt("idBornette");
				typeClassif = res.getString("typeClassif");
				if(typeClassif!=null && typeClassif.trim().equals("Vplus")){
					lesVelo[0][2]=1;
				} else {
					lesVelo[0][2]=0;
				}
			}
		}
		res.close();
		//affichage de ce qui va �tre lou�...
		System.out.println("velo: " + lesVelo[0][0] + ", borne: "
				+ lesVelo[0][1] + ", classification: " + typeClassif);
		//et on part faire l'enregistrement de la location!
		enregistrerLocationAbo(conn, idStation, lesVelo[0][0], lesVelo[0][1],
				idClient, lesVelo[0][2]);
	}

	/*
	 * M�thode qui enregistre la location dans la bdd pour un client abonn�
	 */
	private static void enregistrerLocationAbo(Connection conn, int idStation,
			int idVelo, int idBornette, int idClient, int idClassif){
		//maj table locationVelo
		String requeteAjoutLoc = "INSERT INTO LOCATIONVELO VALUES(idLocation_seq.nextVal, "
				+ idStation
				+ ", null, "
				+ idVelo
				+ ", "
				+ idClient
				+ ", sysdate, null, null, " + idClassif + ")";
		//maj table bornette
		String requeteMajBorne = "UPDATE BORNETTE SET idVelo=null WHERE idBornette="
				+ idBornette;
		//maj table velo
		String requeteMajVelo = "UPDATE VELO SET localisationVelo='Location' WHERE idVelo="
				+ idVelo;
		//et on envoie tout gaiement!
		Statement stmt;
		try {
			stmt = conn.createStatement();
			stmt.executeUpdate(requeteAjoutLoc);
			stmt.executeUpdate(requeteMajVelo);
			stmt.executeUpdate(requeteMajBorne);
			conn.commit();
			//retour � l'ecran principal
			InterfaceClient.ouvrirInterfaceClient();
		} catch (SQLException e) {
			System.out.println(e.getLocalizedMessage());
		}



	}

	/*
	 * M�thode pour r�cup�rer les infos n�cessaire au retour de location, qui appelle ensuite une m�thode pour enregistrer le retour
	 */
	public static void rendreLocationAbo(Connection conn, int idStation,
			int idClient, int etatVelo) throws SQLException {
		@SuppressWarnings("resource")
		Scanner sc = new Scanner(System.in);
		int idVelo = -1;
		int idBorne = -1;
		String typeClassif=null;
		int bonusVPlus = 1;
		int idLocation = -1;
		double prixLoc = 0;
		int amende = 0;

		System.out.println("Saisissez le numero du velo a rendre");
		idVelo = sc.nextInt();
		//on v�rifie que c'est bien le bon v�lo qui revient
		String requete = "SELECT idClient, bonusVPlus, idLocation FROM locationVelo WHERE idVelo="
				+ idVelo + " and FinLoc IS NULL and idClient=" + idClient;
		Statement stmt = conn.createStatement();
		ResultSet res = stmt.executeQuery(requete);
		//si res.next() renvoie faux, alors pas d'entr�e correspondante donc pas le bon v�lo sinon on r�cup�re les infos
		if (res.next()) {
			bonusVPlus = res.getInt("bonusVPlus");
			idLocation = res.getInt("idLocation");
			String requete2 = "SELECT b.idBornette, c.typeClassif FROM Bornette b JOIN STATION s on b.idStation=s.idStation LEFT OUTER JOIN (SELECT * FROM CLASSIFICATION WHERE sysdate between heureDebutClassif AND heureFinClassif) c ON s.idStation=c.idStation WHERE s.idStation ="
					+ idStation + " AND b.idVelo IS NULL AND b.etatBornette=1";
			res = stmt.executeQuery(requete2);
			while (res.next()) {
				idBorne = res.getInt("idBornette");
				typeClassif = res.getString("typeClassif");
			}
			//calcul de la dur�e en minute de la location puis du prix
			String requete3 = "SELECT (sysdate-debutLoc)*1440 FROM locationVelo where idLocation="+idLocation;
			res=stmt.executeQuery(requete3);
			while(res.next()){
				if ((Double.parseDouble((res.getString(1))))>720){
					System.out.println("Une amende a ete emise pour une location superieure a 12 heures!");
					amende = 1;
				}
				if((0.01*(Double.parseDouble((res.getString(1)))-(30*bonusVPlus)))>0){
					prixLoc=(0.01*(Double.parseDouble((res.getString(1)))-(30*bonusVPlus)))+(amende*100);
				}
			}
			res.close();
			//on affiche les infos de retour, et un message si bonus VPlus (qu'on laisse � 1, 0 sinon pour tester lors de l'enregistrement)
			System.out.println("velo: " + idVelo + ", borne: " + idBorne
					+ ", classification: " + typeClassif);
			System.out.println("La location vous coutera: "+((int)(prixLoc*100))/100+" euros");
			if (typeClassif!=null && typeClassif.trim().equals("Vplus") && bonusVPlus == 0)
				System.out.println("Vous beneficiez d'un bonus VPlus!");
			else
				bonusVPlus = 0;
			//et on va gaiement faire l'enregistrement
			enregistrerRetourAbo(conn, idStation, idVelo, idBorne, idClient,
					bonusVPlus, idLocation, etatVelo);
		} else {
			System.out.println("Le numero de velo est incorrect");
		}
		res.close();
	}

	/*
	 * M�thode pour enregistrer le retour du v�lo dans la bdd
	 * On part du principe completement bidon qu'une location coute 0,1 euros par minute, qu'un bonus donne 30 min gratuites et que l'amende est à 100 euros
	 */
	//
	private static void enregistrerRetourAbo(Connection conn, int idStation,
			int idVelo, int idBornette, int idClient, int bonusVPlus,
			int idLocation, int etatVelo) throws SQLException {
		//maj locationVelo
		String requeteRetourLoc = "UPDATE LOCATIONVELO SET idStationFin="
				+ idStation + ", finLoc=sysdate WHERE idLocation=" + idLocation;
		//maj Bornette
		String requeteMajBorne = "UPDATE BORNETTE SET idVelo=" + idVelo
				+ " WHERE idBornette=" + idBornette;
		//maj Velo
		String requeteMajVelo = "UPDATE VELO SET localisationVelo='Bornette', etatVelo="+etatVelo+" WHERE idVelo="
				+ idVelo;
		//maj bonus VPlus, attention il faudra avant r�cup�rer s'il y avait un bonus en cours pour calculer le prix
		String requeteMajBonus = "UPDATE CLIENTABO SET remiseVPlus="+bonusVPlus+" WHERE idClient="
				+ idClient;
		//et on envoie la sauce!
		Statement stmt = conn.createStatement();
		stmt.executeUpdate(requeteRetourLoc);
		stmt.executeUpdate(requeteMajVelo);
		stmt.executeUpdate(requeteMajBorne);
		stmt.executeUpdate(requeteMajBonus);
		conn.commit();
		//retour � l'ecran principal
		InterfaceClient.ouvrirInterfaceClient();
	}
}
